package com.demo.security.service;

import java.time.Duration;

/**
 * 密码加密传输服务.本类通过客户端IP地址生成一个一次性的加密{@code TOKEN},用于在登录界面密码传输的时候,
 * 对密码进行混淆.客户端第一次发出登录请求时,用户密码以明文的方式传输, 一旦被截获, 后果严重.因此密码需要加密,
 * 例如可采用RSA非对称加密.具体流程如下: 客户端向服务器第一次发起登录请求(不传输用户名和密码).
 * 服务器利用RSA算法产生一对公钥和私钥.并保留私钥, 将公钥发送给客户端. 客户端收到公钥后, 加密用户密码,
 * 向服务器发起第二次登录请求(传输用户名和加密后的密码). 服务器利用保留的私钥对密文进行解密,得到真正的密码.
 *
 * @author molong
 * @since 2024/6/7
 */
public interface EncryptTransferService {

    /**
     * 获取一个RSA的公钥,公钥菜单随机生成,每一次获取的都是不一样的KEY,每次获取公钥的时候.都会都生成对应的一个私钥KEY
     *
     * @return RSA公钥
     */
    String getPublicKey();

    /**
     * 对RSA加密后的数据进行解密操作,解密传入通过{@link #getPublicKey()}获取到的公钥,通过公钥,方法自动加载对应的密钥
     * 进行解密操作.同时每一个公钥只能调用一此解密操作,则会抛出{@link IllegalArgumentException}异常.
     *
     * @param publicKey      RSA公钥
     * @param encryptContent 已加密文本
     * @return 解密后的数据
     * @throws IllegalArgumentException 如果一个公钥重复调用则抛出此异常
     */
    String decrypt(String encryptContent, String publicKey);

    /**
     * 生成与{@link #getPublicKey()}一致功能的RSA公钥,但可以自定义其失效时间,其超时时间必须为大于0的自然数
     *
     * @param delay 设置超时时间,单位(秒)
     * @return RSA公钥
     * @since 2.5
     */
    String getPublicKey(Duration delay);

    /**
     * 通过公钥,获取私钥,如果当前加密对象过期,则返回空
     *
     * @param publicKey RSA公钥
     * @return 私钥
     */
    String getPrivateKey(String publicKey);
}
